Go管道阻塞、常见用法以及底层实现
channel数据结构一、管道状态二、阻塞2.1 什么时候发生阻塞?2.2 阻塞的本质?
三、常见错误四、管道常见用法4.1 单向管道4.2 select4.3 for-range
channel数据结构
type hchan struct {
qcount uint //当前元素个数(len)
dataqsiz uint //队列长度(cap)
buf unsafe.Pointer //队列指针,指向队列内存位置
elemsize uint16 //单个元素大小
closed uint32 //标识通道状态
elemtype *_type //元素类型
sendx uint //下一个元素存放的位置
recvx uint //下一个元素读取的位置
recvq waitq //等待读消息的协程队列
sendq waitq //等待发消息的协程队列
lock mutex //互斥锁,保证不存在并发读写管道
//可以在GOROOT/src/runtime/chan.go里看到源码
}
一、管道状态
通过closed字段可知我们可以对管道是否关闭进行判断:
var ch=make(chan int)
go func() {
for i := 0; i |